<?php
/**
 * Стритель полей форм, в дальнейшом создать возможность
 * создавать по одному полю.
 * @author nrnwest@gmail.com
 *
 */
class Arm_Form_Builder
{
    /**
     * Arm_Form_Builder_Sql_Pdo_Mysql
     * 
     * @var Arm_Form_Builder_Sql_Pdo_Mysql $_sql
     */
    protected $_sql = null;
    
    /**
     * Типы полей который обрабатыаем.
     * @var array $_typeColumns
     */                            
    protected $_builderTemplate =  array(
        'text'     => array('VARCHAR', 'CHAR'), 
        'textarea' => array('TINYTEXT', 'TEXT', 'MEDIUMTEXT', 'LONGTEXT'),
        'select'   => array('SET','ENUM'),
        'hidden'   => array('INTEGER', 'BIGINT', 'TINYINT', 'SMALLINT', 'MEDIUMINT', 'INT')
    );
    /**
     * Префикс для плагинов.
     * @var string $_prefixPlugin
     */
    protected $_prefixPlugin = 'Arm_Form_Builder_Plugin_';
    
    /**
     * Конструктор
     */
    public function __construct()
    {
      $this->_sql = Arm_Db::getSqlObject('Arm_Form_Builder_Sql');
    }
    
    /**
     * Получает таблицы на основании $prefix - начало имени, и на основе 
     * полей таблицы строит базовые элементы формы.
     * Если префикс = Arm будут добавленны элементы в класс Arm_Form_Elements
     * Если префикс соотвествует начало имени модуля то элементы будут добавленны
     * в соотвествующий класс модуля.
     * 
     * @param string $prefix arm|test
     * @throws Arm_Form_Builder_Exception если не верно задан префикс
     */
    public function elements($prefix)
    {
         $tables = array();
         foreach ($this->_sql->getTables() as $k=>$v) {
             if(strpos($k, $prefix . '_') === 0) {
                 $tables[$k] = $v;
             }
         }
         if($tables === array()) {
             throw new Arm_Form_Builder_Exception(Arm_Translate::_('Вы задали не верный префикс нету таблиц в базе 
             с именем начинающеемся с %s', $prefix));
         }
         $columnsAll = array();
         foreach ($tables as $k=>$v) {
             // получаем только столбци которые проходят.
             $columns = $this->_getColumns($v); 
             foreach ($columns as $k=>$v) {
                $columnsAll[$v['TABLE_NAME'] . $v['COLUMN_NAME']] = $v;
             }
         }

         //можем запускать строитель который вызовет помодщников и создаст или допишет класс.
         return $this->_builder($prefix, $columnsAll);
    }
    
    /**
     * Вернет только то столбци для которого возможно построить элемент.
     * @param unknown_type $tableInfo
     */
    protected function _getColumns($tableInfo)
    {
        $result = array();
            foreach ($tableInfo as $column=>$info) {
                // ищем проходной тип поля или нет.
                $type = $this->_searsh($info);
                if (false !== $type) {
                    $info['ARM_HELPER'] = $type;
                    $result[] = $info;
                } 
            }
        return $result;
    }
    
    
    /**
     * Если столбец проходит вернет названия
     * типа поля формы, или false если не проходит.
     * @param array $info
     */
    protected function _searsh($info)
    {
        $type = strtoupper(trim($info['DATA_TYPE']));
        $type = preg_replace('~(^[a-z]+)[^a-z]*.*~i', "$1", $type);
        foreach ($this->_builderTemplate as $k=>$v) {
            if(false !== array_search($type, $v)) {
                return $k;
            }   
        }
        return false;
    }
    
    /**
     * Запускает соотвествующий Plugin считает количество 
     * добавленных полей в результатирующий класс.
     * 
     * 
     * @param unknown_type $nameSpace
     * @param unknown_type $columns
     */
    protected function _builder($nameSpace, $columns)
    {
       $count = 0;
        foreach ($columns as $plugin => $data) {
            $plugin = $this->_getPlugin($data['ARM_HELPER']);
            if($plugin->run($data['COLUMN_NAME'], $nameSpace, $data)) {
                $count++;
            }
        }
        return $count;
    }
    
    /**
     * Создания обьектов плагинов.
     * @param $name
     * @return Arm_Form_Builder_Plugin_Abstract
     */
    protected function _getPlugin($name)
    {
       $name = ucfirst(strtolower($name));
       $class = $this->_prefixPlugin . $name;
       if(Zend_Registry::isRegistered($class)) {
           return Zend_Registry::get($class); 
       } 
       $obj = new $class;
       Zend_Registry::set($class, new $obj);
       return $obj;
    }
    
    
}